iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 9
0
AI & Data

一服見效的 AI 應用系列 第 9

Day 09:協同過濾(Collaborative Filtering) 實作

  • 分享至 

  • xImage
  •  

前言

上一篇介紹了『協同過濾』(Collaborative Filtering)的概念,今天我們就來撰寫程式實作看看。

測試資料集

GroupLens 提供各種不同大小的影評檔案給大家測試,避免執行時間過長,我們選擇最小的檔案ml-100k.zip測試,下載後解壓縮,其中README檔案有詳細敘述每一個資料檔的用途與欄位,這裡會用到的檔案說明如下:

  1. u.data:包含 943 個使用者對 1682 部電影所做的 100000 筆評論,欄位包括:
  • 使用者代碼(user id)
  • 電影代碼(item id)
  • 評論分數(rating)
  • 時間戳記(timestamp)
  1. u.item:1682 部電影基本資料,欄位很多,這裡只會用到前兩欄,電影代碼(movie id)、電影名稱(movie title)。

處理步驟如下:

  1. 讀取u.item、u.data 兩個檔案,並合併。
  2. 使用樞紐分析函數(pivot_table),將資料轉換 USER-ITEM Matrix。
  3. 計算 USER-USER、ITEM-ITEM Similarity Matrix。
  4. 隨機指定一個使用者或商品,進行測試,列出推薦的商品。

資料轉換

  1. 讀取 u.item、u.data 兩個檔案。
import pandas as pd
# Read the input training data
input_data_file_movie = "./ml-100k/u.item"
input_data_file_rating = "./ml-100k/u.data"

movie = pd.read_csv(input_data_file_movie, sep='|', encoding='ISO-8859-1', names=['movie_id', 'movie_title'], usecols = [0,1,])
rating = pd.read_csv(input_data_file_rating, sep='\t', encoding='ISO-8859-1', names=["user_id","movie_id","rating"], usecols = [0,1,2])
print(movie.head())
print(rating.head())
  1. 合併兩個資料表。
# then merge movie and rating data
data = pd.merge(movie,rating)
data.head()
  1. 使用樞紐分析函數(pivot_table),將資料轉換 USER-ITEM Matrix。
pivot_table = data.pivot_table(index = ["user_id"],columns = ["movie_title"],values = "rating")
pivot_table.head(10)
  1. 使用關聯係數函數(corrwith),計算 ITEM-ITEM 協同過濾相似性(Similarity)。得到與 Bad Boys (1995) 這部電影最相似的5部電影名稱。
movie_watched = pivot_table["Bad Boys (1995)"]
similarity_with_other_movies = pivot_table.corrwith(movie_watched)  # find correlation between "Bad Boys (1995)" and other movies
similarity_with_other_movies = similarity_with_other_movies.sort_values(ascending=False)
similarity_with_other_movies.head()

https://ithelp.ithome.com.tw/upload/images/20190918/20001976QjPQrlt0vZ.png

  1. 修改3、4步驟,計算 USER-USER 協同過濾相似性(Similarity)。得到第10個使用者最相似的使用者,再根據他們的喜好推薦。
# lets make a pivot table in order to make rows are users and columns are movies. And values are rating
pivot_table = data.pivot_table(index =["movie_title"],columns =  ["user_id"],values = "rating")
print(pivot_table.head(10))
target_user = pivot_table[10]
similarity_with_other_movies = pivot_table.corrwith(target_user)  # find correlation between "Bad Boys (1995)" and other movies
similarity_with_other_movies = similarity_with_other_movies.sort_values(ascending=False)
similarity_with_other_movies.head()

https://ithelp.ithome.com.tw/upload/images/20190918/200019763F1albiN2d.png

結語

協同過濾的優/缺點如下:

  • 優點:協同過濾是集合眾人的意見進行推薦,比較有可信度。
  • 缺點:冷啟動的問題,採用USER-USER 協同過濾法,遇到新顧客無購買或瀏覽記錄,無法計算與其他顧客的相似度。ITEM-ITEM 協同過濾法也是一樣,新商品也無交易記錄,,無法計算與其他商品的相似度。這時可以考慮使用『Content Based Filtering』。

以上程式是針對單一使用者瀏覽商品時,作出即時的推薦,如果,要執行所有的使用者的推薦清單,可能就要燒點錢,準備比較好的設備,採用平行計算,因為每一個相似性的計算都是可以獨立執行的。

下一篇我們繼續介紹『以模型為基礎的協同過濾』(Model Based Filtering)的作法。

相關程式碼放在這裡的 Day08 Collaborative Filtering 目錄。


上一篇
Day 08:協同過濾(Collaborative Filtering)
下一篇
Day 10:以模型為基礎的協同過濾 (Model Based Filtering)
系列文
一服見效的 AI 應用14
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言